<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
    //     new Promise((resolve, reject) => {
    //     console.log("开始请求A数据......")
    //     try {
    //       setTimeout(() => {
    //         console.log("A数据请求成功");
    //         //模拟请求回来的数据
    //         const username = {
    //           user: "laoliu"
    //         }
    //         resolve(username)
    //       }, 1500)
    //     } catch (e) {
    //       reject(e.message)
    //     }
    //   })

    //   /*
    //   调用then的promise是pending状态时,
    //   调用then的promise是成功状态时
    //     -then的回调函数没有返回值时
    //     -then的回调函数有返回值时
    //         -返回值是promise实例对象时
    //     -then的回调函数报错时,
    //   调用then的promise是失败状态时
    //   */
    //   .then(value => {
    //     return new Promise((resolve, reject) => {
    //       console.log("开始请求B数据......")
    //       try {
    //         setTimeout(() => {
    //           console.log("B数据请求成功");
    //           //模拟请求回来的数据
    //           const age = {
    //             age: 18
    //           }
    //           resolve({
    //             ...value,
    //             ...age
    //           })
    //           // resolve(Object.assign({}, value, age))
    //         }, 1500)
    //       } catch (e) {
    //         reject(e.message)
    //       }
    //     })
    //   })

    //   .then(value => {
    //     return new Promise((resolve, reject) => {
    //       console.log("开始请求C数据......")
    //       try {
    //         setTimeout(() => {
    //           console.log("C数据请求成功");
    //           //模拟请求回来的数据
    //           const sex = {
    //             sex: "男"
    //           }
    //           resolve({
    //             ...value,
    //             ...sex
    //           })
    //         }, 1500)
    //       } catch (e) {
    //         reject(e.message)
    //       }
    //     })
    //   })

    //   .then(value => {
    //     //处理value
    //     console.log(value);
    //   })
    //   /*
    //     catch主要 助理失败状态的promise实例的
    //     规则与then一样
    //   */
    //   .catch(reason => {
    //     console.log("这里是异常处理");
    //   })

    /*
     async的定义:
        -async是异步编程的终极解决策略,用同步表达异步
        -async用来声明某个函数是异步函数,await是等待一个异步的执行
    await的使用:
        -await只等待promise实例,其他的一概不等.await后所有的语句都会变成异步
        -如果await后面不是promise,数值和布尔值直接忽略,字符串会按索引下标拆分成对象的键值对,依次排列
        -当await等待的promise实例变成成功状态时,继续执行await语句后的内容,await返回当前成功promise的值
        -如果await等待的promise实例变成失败状态,则直接退出当前async函数,不再执行函数中的其他语句
    async的返回值:
        -默认返回成功的promise实例,值为async函数内部return的值
           -如果return的是promise实例,则async返回的promise值和这个promise保持一致  
           -如果没有return,则返回值为undefined
        -当async中的await等待的是失败的promise实例时,async返回的promise实例将与await等待的失败的promise保持一致
        -当async内部报错时,直接返回失败的promise实例,值为错误信息 
        */ 

       

    function p1(){
        console.log("请求A数据");
        return new Promise((resolve,reject)=>{
            try{
                setTimeout(()=>{
                    console.log("A数据请求成功");
                    // 模拟A数据
                    const user = {
                        name: "李四"
                    }
                    resolve(user)
                },500) 
            }catch(e){
                reject(e.message)
            }
        })
        
    }

    function p2(user){
        console.log("请求B数据");
        return new Promise((resolve,reject)=>{
            try{
                setTimeout(()=>{
                    console.log("B数据请求成功");
                    // 模拟B数据
                    const sex = {
                        sex: "女"
                    }
                    resolve({
                        ...user,
                        ...sex
                    })
                },1500) 
            }catch(e){
                reject(e.message)
            }
        })
        
    }

    function p3(sex){
        console.log("请求C数据");
        return new Promise((resolve,reject)=>{
            try{
                setTimeout(()=>{
                    console.log("C数据请求成功");
                    // 模拟C数据
                    const age = {
                        age: 18
                    }
                    resolve({
                        ...sex,
                        ...age
                    })
                },2500) 
            }catch(e){
                reject(e.message)
            }
        })
        
    }



    async function getData(){
        
        // 必须再async中执行,await后面的代码都是异步代码
        // 只有执行完await后面的语句后,才能继续往下执行
        // const user = await "我不是promise"//将每个字母拆分开,以索引为属性名,放在数组中
        // const user = await String("1")//同上
        // const user = await Boolean("1")//与数值一样,直接忽略
        // const user = await Number("abc")

        const user = await p1()
        // 常量user返回的是成功状态的promise的值
        console.log("user",user);//{name:"李四"}
        //如果不通过传参将变量传进p2,p3,则p2和p3会无法使用user和sex的值
        const sex = await p2(user)
        const age = await p3(sex)

        // console.log(age);//{0: '我', 1: '不', 2: '是', 3: 'p', 4: 'r', 5: 'o', 6: 'm', 7: 'i', 8: 's', 9: 'e', sex: '女', age: 18}
        console.log(age);
    }
    getData()
    //   const allResult = Promise.all([])
    </script>
</body>
</html>